% 读取彩色图像
photo_path = './photo.jpg';
color_image = imread(photo_path);

% 将彩色图像转换为灰度图像
gray_image = rgb2gray(color_image);

% 构造两个不同的结构元素
se1 = strel('disk', 5);
se2 = strel('line', 10, 45);

% 使用imdilate函数进行膨胀处理
dilated_image1 = imdilate(gray_image, se1);
dilated_image2 = imdilate(gray_image, se2);

% 显示原图及两个膨胀处理结果
figure;
subplot(1, 3, 1);
imshow(color_image);
title('原始图像');

subplot(1, 3, 2);
imshow(dilated_image1);
title('膨胀图像 1');

subplot(1, 3, 3);
imshow(dilated_image2);
title('膨胀图像 2');

%%
%（2）
% 读取彩色图像
photo_path = './photo.jpg';
original_image = imread(photo_path);

% 转换为灰度图像
gray_image = rgb2gray(original_image);

% 构造两个不同的结构元素
se1 = strel('disk', 5);
se2 = strel('line', 10, 45);

% 使用imerode函数进行腐蚀处理
eroded_image1 = imerode(gray_image, se1);
eroded_image2 = imerode(gray_image, se2);

% 显示原图及两个腐蚀处理结果
figure;
subplot(1, 3, 1);
imshow(gray_image);
title('原始灰度图像');

subplot(1, 3, 2);
imshow(eroded_image1);
title('腐蚀处理结果1');

subplot(1, 3, 3);
imshow(eroded_image2);
title('腐蚀处理结果2');

%%
%（3）
% 读取彩色图像
photo_path = './photo1.jpg';
original_image = imread(photo_path);

% 转换为灰度图像
gray_image = rgb2gray(original_image);

% 转换为二值图像，使用自定义阈值
threshold = 0.7;
binary_image = imbinarize(gray_image, threshold);

% 构造矩形块和线段的结构元素
se_rect = strel('rectangle', [21, 21]); 
se_line1 = strel('line', 40, 45); 
se_line2 = strel('line', 40, 135);

% 提取矩形块(先膨胀后腐蚀)
opened_rect = imdilate(binary_image, se_rect);
eroded_rect = imerode(opened_rect, se_rect);

% 提取45度角线段
opened_line1 = imdilate(binary_image, se_line1);

% 提取135度角线段
opened_line2 = imdilate(binary_image, se_line2);

% 合并两个结果
opened_lines = opened_line1 & opened_line2;

% 显示原始二值图像及提取结果
figure(2);
subplot(1, 3, 1);
imshow(binary_image);
title('原始二值图像');

subplot(1, 3, 2);
imshow(eroded_rect);
title('矩形块提取结果');

subplot(1, 3, 3);
imshow(opened_lines);
title('线段提取结果');

%%
%（4）
photo_path = './photo2.png';
% 读取图像
original_image = imread(photo_path);

% 转换为灰度图像
gray_image = rgb2gray(original_image);

% 转换为二值图像，使用自适应阈值
binary_image = imbinarize(gray_image, 'adaptive', 'ForegroundPolarity', 'dark', 'Sensitivity', 0.5);

% 形态学运算进行降噪
se_noise = strel('disk', 5); % 结构元素
binary_image = imopen(binary_image, se_noise);

% 形态学运算提取轮廓
se_outline = strel('disk', 1); % 结构元素
outline_image = imdilate(binary_image, se_outline) - binary_image;

% 计数米粒数量
[labeled_image, num_grains] = bwlabel(binary_image);

% 显示结果
figure;
subplot(1, 3, 1);
imshow(original_image);
title('原始图像');

subplot(1, 3, 2);
imshow(binary_image);
title('二值图像');

subplot(1, 3, 3);
imshow(outline_image);
title('轮廓提取结果');

% 显示米粒数量
disp(['米粒数量: ', num2str(num_grains)]);
